// sequeue stack

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>

#define N 32

typedef struct
{
    int data[N]; //数组空间
    int index;   //是数组下标的索引
} seqstack_t;

seqstack_t *create_empty_seqstack()
{
    seqstack_t *s = (seqstack_t *)malloc(sizeof(seqstack_t));
    memset(s->data, 0, sizeof(s->data)); //把数组中内容清为0
    s->index = -1;  //表示栈里面为空
    return s;
}

//为空为真
int seqstack_is_empty(seqstack_t *s)
{
    return (s->index == -1);
}


int seqstack_is_full(seqstack_t *s)
{
    return (s->index == N -1);
}

//入栈，压栈
int seqstack_push(seqstack_t *s, int value)
{
    if (seqstack_is_full(s))
    {
        printf("栈已满");
        return -1;
    }

    s->index++;
    s->data[s->index] = value;

    return 0;
}

//出栈,弹栈
int seqstack_pop(seqstack_t *s, int *pvalue)
{
    if (seqstack_is_empty(s))
    {
        printf("栈已空");
        return -1;
    }

    *pvalue = s->data[s->index];
    s->index--;

    return 0;
}

int main(int argc, char const *argv[])
{
    seqstack_t *S = create_empty_seqstack();

    printf("入栈顺序: ");
    for (int i = 0; i < 33; i++)
    {     
        if (seqstack_push(S, i + 1) == 0)   //表示成功
        {
            printf("%d ", i + 1);
        }
    }
    printf("\n");

    printf("出栈顺序: ");
    for (int i = 0, value; i < 33; i++)
    {
        if (seqstack_pop(S, &value) == 0)   //表示成功
        {
            printf("%d ", value);
        }
    }
    printf("\n");

    return 0;
}
